% Created 2022-05-19 周四 13:18
% Intended LaTeX compiler: xelatex
\documentclass[a4paper]{article}
                 \usepackage{graphicx}
                 \usepackage{xcolor}
                 \usepackage{xeCJK}
                 \usepackage{fixltx2e}
                 \usepackage{longtable}
                 \usepackage{float}        
                 \usepackage{tikz}         
                 \usepackage{wrapfig}      
                 \usepackage{latexsym,amssymb,amsmath}
                 \usepackage{textcomp}
                 \usepackage{bicaption}
                 \usepackage{listings}     
                \usepackage{marvosym}     
                \usepackage{textcomp}     
                \usepackage{latexsym}     
                \usepackage{natbib}
                \usepackage{indentfirst}
		\usepackage{hyperref}
                \usepackage{geometry}
                \usepackage{minted}
                \setCJKmainfont{宋体}
                \setlength{\parindent}{2em}
                \usepackage{color}
                \usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead[R]{\footnotesize{《Android 物联网应用程序开发》 广西职业师范学院实验教学指导书}}
\geometry{a4paper,left=2.5cm,right=2.5cm,top=2cm,bottom=2cm}
\setCJKmainfont{仿宋}
\setCJKsansfont{Microsoft YaHei}
\setCJKmonofont{Microsoft YaHei}

            \lstset{
  columns=fixed,       
  breaklines=true, breakautoindent=true,breakindent=4em,
  numbers=left,                                        % 在左侧显示行号
  frame=none,                                          % 不显示背景边框
  backgroundcolor=\color[RGB]{245,245,244},            % 设定背景颜色
  keywordstyle=\color[RGB]{40,40,255},                 % 设定关键字颜色
  numberstyle=\footnotesize\color{darkgray},           % 设定行号格式
  commentstyle=\it\color[RGB]{0,96,96},                % 设置代码注释的格式
  stringstyle=\rmfamily\slshape\color[RGB]{128,0,0},   % 设置字符串格式
  showstringspaces=false,                              % 不显示字符串中的空格
  language=java,                                        % 设置语言
}

\usemintedstyle{emacs}
    \setminted{%
        autogobble,% automatically remove the spaces to the left of the code
        linenos=true,% show line numbers
        fontsize=\small,% smaller font size
        % escapeinside=@@,% insert latex code between @ and @
        frame=lines,% frame styles: none or lines
        % frame=none,
        numbers=none,% show line numbers on: left, right, both or none
        mathescape=true,% insert math code
	breaklines=true,
    }%
    \setmintedinline{%
        fontsize=\smallsize,
    }%
\date{\today}
\title{实验九: 相机权限申请}
\hypersetup{
 pdfauthor={},
 pdftitle={实验九: 相机权限申请},
 pdfkeywords={},
 pdfsubject={},
 pdfcreator={Emacs 27.1 (Org mode 9.3.8)}, 
 pdflang={English}}
\begin{document}

\maketitle
\tableofcontents

\newpage

\section{实验目的}
\label{sec:org54f60c5}
\begin{itemize}
\item 掌握 Android 权限申请的方式
\end{itemize}
\section{实验设备和器件}
\label{sec:org9169d51}
\begin{itemize}
\item PC
\item 内存要求 8G 以上
\end{itemize}
\section{实验内容}
\label{sec:orga754ddb}
\subsection{实训步骤}
\label{sec:org0681a72}
\subsubsection{step1 界面设计}
\label{sec:org69f07db}
\begin{itemize}
\item 按下图设计界面，一个ImageView 组件负责接收拍好的照片，一个 Button 组件负责启动拍照
\begin{center}
\includegraphics[width=0.5\textwidth]{./img/screenshot_20220519_130312.png}
\end{center}
\end{itemize}
\subsubsection{step2 请求使用相机权限}
\label{sec:org96d34f0}
\begin{itemize}
\item 为了让用户知道应用需要依赖相机，在Manifest清单文件中添加<uses-feature>标签:
\lstset{language=XML,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
 <manifest ... >
 <uses-feature android:name="android.hardware.camera"
	       android:required="true" />
 ...
</manifest>
\end{lstlisting}
\item 如果我们的应用使用相机，但相机并不是应用的正常运行所必不可少的组
件，可以将android:required设置为"false"。这样的话，Google Play
也会允许没有相机的设备下载该应用。当然我们有必要在使用相机之前通
过调用hasSystemFeature(PackageManager.FEATURE\_CAMERA)方法来检查
设备上是否有相机。如果没有，我们应该禁用和相机相关的功能！

\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
PackageManager pm = getPackageManager();
boolean hasCamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
if(hasCamera)
{
    dispatchTakePictureIntent();
} else {
    Toast.makeText(MainActivity.this," 没有相机!",Toast.LENGTH_LONG).show();
}
\end{lstlisting}
\end{itemize}
\subsubsection{step3 使用相机应用程序进行拍照}
\label{sec:orgb9eaf88}
\begin{itemize}
\item 利用一个描述了执行目的Intent对象，Android可以将某些执行任务委托
给其他应用。整个过程包含三部分： Intent 本身，一个函数调用来启动
外部的 Activity，当焦点返回到我们的Activity时，处理返回图像数据
的代码。
\item 下面的函数通过发送一个Intent来捕获照片：
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
	startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}
\end{lstlisting}
\begin{itemize}
\item 注意在调用startActivityForResult()方法之前，先调用
resolveActivity()，这个方法会返回能处理该Intent的第一个
Activity,即检查有没有能处理这个Intent的Activity。执行这个检查非
常重要，因为如果在调用startActivityForResult()时，没有应用能处
理你的Intent，应用将会崩溃。所以只要返回结果不为null，使用该
Intent就是安全的。
\end{itemize}
\end{itemize}

\subsubsection{step4 获取缩略图}
\label{sec:orgd0cfb22}
\begin{itemize}
\item 拍摄照片并不是应用的最终目的，我们还想要从相机应用那里取回拍摄的照片，并对它执行某些操作。
\item Android的相机应用会把拍好的照片编码为缩小的Bitmap，使用extra
value的方式添加到返回的Intent当中，并传送给onActivityResult()，
对应的Key为"data"。下面的代码展示的是如何获取这一图片并显示在ImageView上。
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
	Bundle extras = data.getExtras();
	Bitmap imageBitmap = (Bitmap) extras.get("data");
	mImageView.setImageBitmap(imageBitmap);
    }
}
\end{lstlisting}
\item 注意: 这张从"data"中取出的缩略图适用于作为图标，但其他作用会比较
有限。而处理一张全尺寸图片需要做更多的工作。
\end{itemize}
\end{document}